/**
 * Created by wanglei on 2017/8/3.
 */
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;
import common.config.AbuyunDynamicProxyRequester;
import common.config.JDBCHelper;
import org.springframework.jdbc.core.JdbcTemplate;


/**
 *
 * WebCollector 2.40新特性 page.matchType
 * 在添加CrawlDatum时（添加种子、或在抓取时向next中添加任务），
 * 可以为CrawlDatum设置type信息
 *
 * type的本质也是meta信息，为CrawlDatum的附加信息
 * 在添加种子或向next中添加任务时，设置type信息可以简化爬虫的开发
 *
 * 例如在处理列表页时，爬虫解析出内容页的链接，在将内容页链接作为后续任务
 * 将next中添加时，可设置其type信息为content（可自定义），在后续抓取中，
 * 通过page.matchType("content")就可判断正在解析的页面是否为内容页
 *
 * 设置type的方法主要有3种：
 * 1）添加种子时，addSeed(url,type)
 * 2）向next中添加后续任务时：next.add(url,type)或next.add(links,type)
 * 3）在定义CrawlDatum时：crawlDatum.type(type)
 *
 * @author hu
 */
public class DemoTypeCrawler extends RamCrawler {
   static JdbcTemplate jdbcTemplate = null;
    /*
        该教程是DemoMetaCrawler的简化版

        该Demo爬虫需要应对豆瓣图书的三种页面：
        1）标签页（taglist，包含图书列表页的入口链接）
        2）列表页（booklist，包含图书详情页的入口链接）
        3）图书详情页（content）

        另一种常用的遍历方法可参考TutorialCrawler
     */
    public void visit(Page page, CrawlDatums next) {
        System.out.println(page.html());
        if(page.matchType("taglist")){
            //如果是列表页，抽取内容页链接
            //将内容页链接的type设置为content，并添加到后续任务中
            next.add(page.links("table.tagCol td>a"),"booklist");
        }else if(page.matchType("booklist")){
            next.add(page.links("div.info>h2>a"),"content");
        }else if(page.matchType("content")){
            //处理内容页，抽取书名和豆瓣评分
            String title=page.select("h1>span").first().text();
            String score=page.select("strong.ll.rating_num").first().text();
            System.out.println("title:"+title+"\tscore:"+score);

            if (jdbcTemplate != null) {
                int updates=jdbcTemplate.update("insert into tb_content"
                                +" (title,url,html) value(?,?,?)",
                        title,page.url(),page.html());
                if(updates==1){
                    System.out.println("mysql插入成功");
                }
            }
        }
    }
    public static void main(String[] args) throws Exception {

        try {
            jdbcTemplate = JDBCHelper.createMysqlTemplate("mysql1",
                    "jdbc:mysql://127.0.0.1/db1?useUnicode=true&characterEncoding=utf8",
                    "root", "brysjhhrhl", 5, 30);

    /*创建数据表*/
            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS tb_content ("
                    + "id int(11) NOT NULL AUTO_INCREMENT,"
                    + "title varchar(50),url varchar(200),html longtext,"
                    + "PRIMARY KEY (id)"
                    + ") ENGINE=MyISAM DEFAULT CHARSET=utf8;");
            System.out.println("成功创建数据表 tb_content");
        } catch (Exception ex) {
            jdbcTemplate = null;
            System.out.println("mysql未开启或JDBCHelper.createMysqlTemplate中参数配置不正确!");
        }
        DemoTypeCrawler crawler = new DemoTypeCrawler();
        crawler.setRequester(new AbuyunDynamicProxyRequester("HJPC687W1I2E99HD", "8F9AAB9926EEE9AC"));
       // crawler.addSeed("https://book.douban.com/tag/","taglist");
        crawler.addSeed( "http://wenshu.court.gov.cn/list/list/?sorttype=1&conditions=searchWord+QWJS+++全文检索:强迫劳动","taglist" );
        /*可以设置每个线程visit的间隔，这里是毫秒*/
        //crawler.setVisitInterval(1000);
       // crawler.setExecuteInterval(1000);
        /*可以设置http请求重试的间隔，这里是毫秒*/
        //crawler.setRetryInterval(1000);
        crawler.setThreads(5);
        crawler.start(3);
    }

}